import json

import numpy as np
from PyQt6 import uic
from PyQt6.QtCore import Qt, QSize
from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QWidget, QToolButton, QCheckBox, QSpacerItem, QSizePolicy

from utils.index import resource_path


class Window(QWidget):
    def __init__(self, path, historyPage):
        super().__init__()
        self.path = path
        self.ui = uic.loadUi(resource_path("static/ui/historyListDel.ui"), self)  # 加载 UI 文件
        self.history_page = historyPage
        # 设置窗口模态为 WindowModal
        self.setWindowModality(Qt.WindowModality.WindowModal)
        self.init()  # 初始化页面样式，页面内容
        # self.initEvent()

        # ========================================================
        # 重写方法
        # ========================================================
        # 根据窗口宽度动态调整

    def resizeEvent(self, event):
        # 获取窗口当前宽度
        width = self.width()
        # 根据窗口宽度动态调整字体大小
        fontSize = int(width / 150)
        if fontSize < 10:
            fontSize = 10
        if fontSize > 18:
            fontSize = 18

        # 定义一个递归函数来遍历所有子控件，并设置字体大小
        def traverse_widgets(widget):
            if hasattr(widget, 'setFont'):
                font = widget.font()
                font.setPointSize(fontSize)
                widget.setFont(font)
            for child in widget.children():
                traverse_widgets(child)

        # 从主窗口开始遍历所有控件
        traverse_widgets(self)

        super().resizeEvent(event)

    # ========================================================
    # 初始化
    # ========================================================

    def init(self):
        self.init_style()  # 初始化页面样式
        self.init_widget()  # 初始化页面控件
        self.init_event()  # 初始化事件

    # 设置窗口图标和标题
    def init_style(self):
        self.ui.setWindowTitle(f"SeismicPlot-{self.history_page.module_name}历史记录批量删除")
        self.ui.setWindowIcon(QIcon('static/image/favicon.ico'))

    # 初始化页面控件
    def init_widget(self):
        self.delete_all_content()
        layout = self.ui.scrollArea.widget().layout()

        # 读取历史记录文件
        with open(self.path, 'r', encoding='utf-8') as file:
            history_data = json.load(file)
            bridge_history_data = history_data.get(self.history_page.e_name, [])

        # 遍历内容列表，创建多选框并添加到垂直布局中
        for index in range(len(bridge_history_data)):
            checkbox = QCheckBox()
            checkbox.setText(f"{index + 1} {bridge_history_data[index]['title']}")
            layout.addWidget(checkbox)

        vertical_spacer = QSpacerItem(0, 0, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)  # 创建垂向弹簧
        layout.addItem(vertical_spacer)  # 将垂向弹簧添加到布局中

    # 清除scrollArea中的所有选项
    def delete_all_content(self):
        widget = self.ui.scrollArea.widget()
        if widget:
            # 获取视口的布局
            layout = widget.layout()
            if layout:
                # 移除布局中的所有控件
                while layout.count():
                    item = layout.takeAt(0)
                    widget = item.widget()
                    if widget:
                        widget.setParent(None)
                        widget.deleteLater()

    # 初始化事件
    def init_event(self):
        self.ui.toolButton.clicked.connect(self.click_ok)  # ok
        self.ui.toolButton_2.clicked.connect(self.click_cancel)  # cancel
        self.ui.toolButton_3.clicked.connect(self.click_apply)  # apply
        self.ui.toolButton_4.clicked.connect(self.select_all)  # 全选
        self.ui.toolButton_5.clicked.connect(self.select_no)  # 取消

    # 多选框全选
    def select_all(self):
        # 获取窗口的所有子控件
        all_children = self.ui.findChildren(QCheckBox)
        # 遍历所有子控件，将多选框设置为选中状态
        for checkbox in all_children:
            checkbox.setChecked(True)

    # 多选框取消多选
    def select_no(self):
        # 获取窗口的所有子控件
        all_children = self.ui.findChildren(QCheckBox)
        # 遍历所有子控件，将多选框设置为选中状态
        for checkbox in all_children:
            checkbox.setChecked(False)

    # ok按钮
    def click_ok(self):
        self.del_history()  # 删除历史记录文件中的数据项
        self.ui.close()  # 关闭弹窗
        self.history_page.init_content()  # 初始化历史记录页面

    # cancel按钮
    def click_cancel(self):
        self.ui.close()  # 关闭弹窗

    # apply按钮
    def click_apply(self):
        self.del_history()  # 删除历史记录中的数据项
        self.init_widget()  # 初始化批量删除历史记录页面控件
        self.history_page.init_content()  # 初始化历史记录页面

    # 删除历史记录文件中的数据项
    def del_history(self):
        # 获取窗口的所有多选框
        all_checkboxes = self.findChildren(QCheckBox)
        selected_index = []
        # 遍历所有多选框，筛选出选中的多选框并获取选中的选项下标
        for checkbox in all_checkboxes:
            if checkbox.isChecked():
                text = checkbox.text()
                arr = text.split(" ")
                selected_index.append(int(arr[0]) - 1)
        # 读取历史记录文件
        with open(self.path, 'r', encoding='utf-8') as file:
            history_data = json.load(file)
            bridge_history_data = history_data.get(self.history_page.e_name, [])
        # 删除数据
        data_array = np.array(bridge_history_data)
        new_array = np.delete(data_array, selected_index)
        history_data[self.history_page.e_name] = new_array.tolist()
        if len(history_data[self.history_page.e_name]) == 0:
            self.ui.close()
        # 历史记录文件重新写入数据
        with open(self.path, 'w', encoding='utf-8') as file:
            json.dump(history_data, file, indent=4)
